#pragma once
#include "HighResolutionTimer.h"
#include "Lock.h"
#include <list>
#include <vector>
/*
* 定时器队列
* 目的: 实现定时器队列.
*
* 一个工作线程维护一个定时器队列,定时器队列是一个有序队列(对于所有有效定时器而言),最快超时的定时器总是在队头.
* 只有工作线程可以操作定时器队列.
*
* 另外有一个专门的操作队列.
* 添加/修改/删除操作时,在把操作类型放入操作队列中,然后唤醒工作线程.
* 工作线程一次处理完所有操作队列中排队的操作.
*/
class TimeQueue
{
public:
	
	//匿名方法
	typedef void(__stdcall *timerFunc)(void *, unsigned char);

	typedef void* timer_t;

	/*定时器通知工作线程处理数据*/
	bool proc(HANDLE handle);

protected:

	//定时器设计
	struct timerDesc
	{
		//定时器执行状态 0 等待 1执行 2 完成
		unsigned char timerStatus;

		//参数
		void * param;
		
		//回调函数完成后通知事件
		HANDLE notice;

		//回调函数地址
		timerFunc callBack;

		//是否有线程等待
		bool watting;

		//超时结束时间
		__int64 timeoutTime;

		//定时器状态 0 空闲 1 等待回调函数 2超时
		int status;

		//是否自动删除
		bool autoDelete;
	};

	//定时器队列
	timerDesc ** timerDesPoolSize;

	// 类型定义
	typedef std::list<timerDesc *> timerDesList;

	typedef std::pair<timerDesc *, int> oppT;

	typedef std::vector<oppT> oppVector;


	//系统等待定时器对象
	HANDLE systemWaitTimerObj;

	//定时器工作线程
	uintptr_t timerWorkThread;

	//工作线程被唤起的原因
	int timerAreAroused;

	//是否停止定时器队列
	bool stopTimerQueue;

	//定时器队列
	timerDesList *timerList;

	//操作队列
	oppVector * operationQueue;

	//高精度计时器
	HighResolutionTimer hTimer;

	//定时器缓存池
	int poolSize;

	//创建工作线程函数
	static unsigned int __stdcall workProc(void * param);

	Lock *lockObj;
	
	// 当前定时器
	timerDesc * currentTimer;

	/* 排队操作 */
	void oppAcQuery(timerDesc *timer, int oppType);

	//唤醒当前定时器
	void wackUpTimer();

public:
	TimeQueue(unsigned int poolSize = 128);
	~TimeQueue();

	//初始化定时器队列
	int init();

	// 创建定时器
	timer_t createTimer(DWORD t, timerFunc callBack, void * param);

	//销毁定时器队列
	int destory();

	/*
	 定时器设计结构体
	 是否等待
	*/
	int deleteTimer(timer_t t, bool wait);


private:
	const unsigned char TQ_ERROR = 1;

	const unsigned char T_SUCCESS = 0;
};

